NC164 最长上升子序列(二)
import java.util.;

public class Solution {
    
      代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     
      该数组最长严格上升子序列的长度
      @param a int整型一维数组 给定的数组
      @return int整型
     
    public int LIS (int[] a) {
         write code here
        if (a == null) {
            return 0;
        }
        ListInteger list = new ArrayList();
        int len = a.length;
        if (len = 1) {
            return len;
        }
        list.add(a[0]);
        for (int i = 1; i  len; i++) {
            fun(list, a[i]);
        }
        return list.size();
    }
    void fun(ListInteger list, int tmp) {
        int l = 0;
        int len = list.size();
        int r = len - 1;
        int mid = 0;
        if (l == r) {
            if (list.get(l) = tmp) {
                list.set(l, tmp);
            } else {
                list.add(tmp);
            }
            return;
        }
        while (l = r) {
            mid = (l + r)  2;
            if (list.get(mid)  tmp) {
                if (mid == 0) {
                    list.set(mid, tmp);
                    return;
                }
                if (list.get(mid - 1)  tmp) {
                    list.set(mid, tmp);
                    return;
                } else if (list.get(mid - 1) == tmp) {
                    return;
                }
                r = mid - 1;
            } else if (list.get(mid) == tmp) {
                return;
            } else {
                if (mid + 1 == len) {
                    list.add(tmp);
                    return;
                }
                if (list.get(mid + 1)  tmp) {
                    list.set(mid + 1, tmp);
                    return;
                } else if (list.get(mid + 1) == tmp) {
                    return;
                }
                l = mid + 1;
            }
        }
    }
}